package de.herzog.bbp.model.dao;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import de.herzog.bbp.model.Halle;
import de.herzog.bbp.model.Klasse;
import de.herzog.bbp.model.Mannschaft;
import de.herzog.bbp.model.Spiel;

public class SpielDAO extends AbstractDAO {

	public static List<Spiel> loadAll() {
		return loadAllOrdered();
	}

	public static List<Spiel> loadAllOrdered(String... properties) {
		Criteria criteria = getSession().createCriteria(Spiel.class);
		for (String property : properties) {
			criteria.addOrder(Order.asc(property));
		}
		return list(criteria);
	}

	public static Spiel loadById(Integer id) {
		return (Spiel) getSession().load(Spiel.class, id);
	}

	public static List<Spiel> loadByKlasse(Klasse klasse) {
		Criteria criteria = getSession().createCriteria(Spiel.class);
		criteria.add(Restrictions.eq("klasse", klasse));
		criteria.addOrder(Order.asc("nummer"));
		return list(criteria);
	}

	public static List<Spiel> loadByExample(Spiel spiel) {
		Criteria criteria = getSession().createCriteria(Spiel.class);
		criteria.add(Example.create(spiel));
		return list(criteria);
	}

	@SuppressWarnings("unchecked")
	private static List<Spiel> list(Criteria criteria) {
		return criteria.list();
	}

	public static Spiel insert(String klasseName, String nummer, Date datum, String zeit, String heimverein,
			String heimnummer, String gastverein, String gastnummer, String halle, String schiri) {
		Integer nummerInt = nummer == null ? null : new Integer(nummer);
		Integer halleInt = halle == null ? null : new Integer(halle.substring(4));
		return insert(klasseName, nummerInt, datum, zeit, heimverein, heimnummer, gastverein, gastnummer, halleInt,
				schiri);
	}

	public static Spiel insert(String klasseName, Integer nummer, Date datum, String zeit, String heimverein,
			String heimnummer, String gastverein, String gastnummer, Integer halleNummer, String schiri) {
		Klasse klasse = KlasseDAO.getByName(klasseName);
		Mannschaft heimMannschaft = MannschaftDAO.getByKlasseVereinNummer(klasseName, heimverein, heimnummer);
		Mannschaft gastMannschaft = MannschaftDAO.getByKlasseVereinNummer(klasseName, gastverein, gastnummer);
		Halle halle = HalleDAO.getByVereinAndNummer(heimMannschaft.getVerein(), halleNummer);
		Spiel spiel = new Spiel(klasse, nummer, datum, zeit, heimMannschaft, gastMannschaft, halle, schiri);
		persist(spiel);
		return spiel;
	}
}
